/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package geradorImagens;

import imagemBmp.FormatoBmp;
import imagemYUV.novoFormato;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JOptionPane;
import utilitarios.Conversoes;
import utilitarios.Histograma;

/**
 *
 * @author jeferson
 */
public class ImagemBuffer {

    public BufferedImage definirImagem(BufferedImage imagem, FormatoBmp bmp) {

        Graphics ponto = imagem.getGraphics().create();

        byte[] BMPdados = bmp.imagem;//retornabytes(formatoBmp.paleta);
        int largura = Conversoes.byteArray2Int4(bmp.BiWidth);
        int altura = Conversoes.byteArray2Int4(bmp.BiHeight);
        int posicaoPaleta, R, G, B;
        int cont = 0;
        int deslocamento = 0;
        int bitsImagem = Conversoes.byteArray2Short(bmp.BiBitCount);
//        int bitsImagem = 8;
        /*
         * A variável deslocamento eh utilizada para se ignorar os bytes
         * utilizados para o preenchimento da linha, requerimento do formato BMP
         * onde se diz que o número de posições em uma linha tem que ser
         * multiplo de 4
         */
        if ((largura % 4) != 0) {
            deslocamento = 4 - (largura % 4);
        }

        //Caso a imagem seja de 8 bits
        if (bitsImagem == 8) {
            System.out.println("Imagem 8 bit");
            Pixel[] paleta = bmp.paleta;
            //percorre a imagem ao contrario
            for (int posicaoLinha = altura; posicaoLinha > 0; posicaoLinha--) {
                for (int posicaoColuna = 0; posicaoColuna < largura; posicaoColuna++) {
                    posicaoPaleta = BMPdados[cont] & 0xFF;

                    B = (paleta[posicaoPaleta].getB() & 0xFF);
                    G = (paleta[posicaoPaleta].getG() & 0xFF);
                    R = (paleta[posicaoPaleta].getR() & 0xFF);
                    Color cor = new Color(R, G, B);

                    ponto.setColor(cor);
                    ponto.drawLine(posicaoColuna, posicaoLinha, posicaoColuna, posicaoLinha);
                    cont++;
                }
                cont += deslocamento;
            }
        }

        //Imagem em 24 bits        
        if (bitsImagem == 24) {
            System.out.println("Entrou 24");
            int deslocamentoColuna = 0;

            if ((largura % 4) != 0) {
                deslocamento = (4 - ((largura * 3) % 4));
            }

            for (int posicaoLinha = altura; posicaoLinha > 0; posicaoLinha--) {
                for (int posicaoColuna = 0; posicaoColuna < largura; posicaoColuna++) {

                    B = ((int) BMPdados[deslocamentoColuna++]) & 0xFF;
                    G = ((int) BMPdados[deslocamentoColuna++]) & 0xFF;
                    R = ((int) BMPdados[deslocamentoColuna++]) & 0xFF;
                    Color cor = new Color(R, G, B);

                    ponto.setColor(cor);
                    ponto.drawLine(posicaoColuna, posicaoLinha, posicaoColuna, posicaoLinha);

                }
                deslocamentoColuna = deslocamentoColuna + deslocamento;
            }
        }
        if (bitsImagem > 24) {
            JOptionPane.showMessageDialog(null, "Imagem com mais de 24 bits: não é possível abri-la");
        }
        if(bitsImagem < 8){
            JOptionPane.showMessageDialog(null, "Imagem com menos de 8 bits");
        }

        return imagem;
    }

    public BufferedImage definirImagem(BufferedImage imagem, novoFormato bmp, boolean tonsCinza) {

        Graphics ponto = imagem.getGraphics().create();

        byte[] BMPdados = bmp.imagem;//retornabytes(formatoBmp.paleta);
        int largura = Conversoes.byteArray2Int4(bmp.largura);
        int altura = Conversoes.byteArray2Int4(bmp.altura);
        int Y, U, V;
        int deslocamentoColuna = 0;
        int deslocamento = 0;

            if ((largura % 4) != 0) {
                deslocamento = (4 - ((largura * 3) % 4));
            }

            for (int posicaoLinha = altura; posicaoLinha > 0; posicaoLinha--) {
                for (int posicaoColuna = 0; posicaoColuna < largura; posicaoColuna++) {
                
                Y = ( BMPdados[deslocamentoColuna++] & 0xFF);
                U = ( BMPdados[deslocamentoColuna++] & 0xFF);
                V = ( BMPdados[deslocamentoColuna++] & 0xFF);
            
                if(Y == U && Y == V){
//                if(tonsCinza == true){
                    Color cor = new Color(Y,Y,Y);
                    ponto.setColor(cor);
                    ponto.drawLine(posicaoColuna, posicaoLinha, posicaoColuna, posicaoLinha);
                }
                else{
                
                int B = (int)(1.164*(Y - 16) + 2.018*(U - 128));
                int G = (int)(1.164*(Y - 16) - 0.813*(V - 128) - 0.391*(U - 128));
                int R = (int)(1.164*(Y - 16) + 1.596*(V - 128));

                if(R > 255){
                    R = 255;
                }
                if(G > 255){
                    G = 255;
                }
                if(B > 255){
                    B = 255;
                }
                if(R < 0 ){
                    R = 0;
                }
                if(G < 0 ){
                    G = 0;
                }
                if(B < 0 ){
                    B = 0;
                }
                Color cor = new Color(R,G,B);
                ponto.setColor(cor);
                ponto.drawLine(posicaoColuna, posicaoLinha, posicaoColuna, posicaoLinha);
                }
            }
            deslocamentoColuna = deslocamentoColuna + deslocamento;
        }
        return imagem;
    }
    
    public BufferedImage desenharHistograma(BufferedImage imagem, Histograma histograma){
        Graphics ponto = imagem.getGraphics().create();
        
        for(int i = 0; i < histograma.cores.length; i++){
            ponto.setColor(Color.red);
            ponto.drawLine(histograma.frequencias[i], histograma.cores[i].getR(),histograma.frequencias[i], histograma.cores[i].getR());
        }
        return imagem;
    }
}
